/*******************************************************************************
* file  : key
* creat : apleilx
* data  : 2017/03/02
*******************************************************************************/
#include "os_obj.h"
#include "iohandle.h"
#include "framework.h"
#include "pincfg.h"
#include "sys_task.h"
#include "gui_main.h"
#include "par\par_tab.h"
#include "par\par_user.h"

/*******************************************************************************
* @brief FUN.
*******************************************************************************/
extern par_manager_type par_set;
extern timer_pulse_type key_pulse;

/*******************************************************************************
* @brief 操作声明.
*******************************************************************************/
void key_exe_none(void);
void key_down_any(void);
void key_release_any(void);
void key_keep_any(void);
void key_idle(void);

void key_set_press(void);
void key_set_release(void);
void key_set_keep(void);
void key_set(key_opt_mode_type mode){};



void key_shift_press(void);
void key_shift_release(void);
void key_shift_keep(void);
void key_shift(key_opt_mode_type mode){};

void key_down_press(void);
void key_down_release(void);
void key_down_keep(void);
void key_down(key_opt_mode_type mode){};

void key_up_press(void);
void key_up_release(void);
void key_up_keep(void);
void key_up(key_opt_mode_type mode){};

void key_set_shift_press(void);
void key_set_shift_release(void);
void key_set_shift_keep(void);
void key_set_shift(key_opt_mode_type mode){};

/*******************************************************************************
* @brief   操作链接.
*******************************************************************************/
const key_opt_type key_list[] = {
	{KEY_VAL_SET, key_set},
	{KEY_VAL_SHIFT, key_shift},
	{KEY_VAL_DN, key_down},
	{KEY_VAL_UP, key_up},
	{KEY_VAL_SET | KEY_VAL_SHIFT, key_set_shift},
	{0} // 列表结束表示符-键值为0
};

/*******************************************************************************
* @brief   按键接口.
*******************************************************************************/
const key_api_type key_api = {
	key_down_any,
	key_keep_any,
	key_list,
	key_release_any,
	key_idle};

/*******************************************************************************
* @brief   按键.
*******************************************************************************/
key8_type key;

/*******************************************************************************
* @brief   task_key.
* @param   thread_input 参数
* @return  none
*******************************************************************************/
void task_key(void *thread_input)
{
}

/*******************************************************************************
* @brief   空闲.
*******************************************************************************/
void key_idle(void)
{
	if (gui_st.key.keep_time_cnt == 300)
	{
		if (par_set.st_set)
		{
			par_user_opt_quit();
		}
	}
	
	gui_st.key.series_space_sv = 3;
}

/*******************************************************************************
* @brief   按键公共处理.
*******************************************************************************/
void key_exe_none(void)
{
}

void key_down_any(void)
{
	if(gui_st.key.serial_cnt == 2)
	{
		switch(gui_st.key.edge.uval)
		{
			case KEY_VAL_SET: dbg_puts("double key : set !\n"); break;
			case KEY_VAL_SHIFT: dbg_puts("double key : shift !\n"); break;
			case KEY_VAL_UP: dbg_puts("double key : up !\n"); break;
			case KEY_VAL_DN: dbg_puts("double key : down !\n"); break;
		}
	}
}

void key_release_any(void)
{
}

void key_keep_any(void)
{
}

/*******************************************************************************
* @brief   set.
*******************************************************************************/
void key_set_press(void)
{
	par_user_key_confirm();
}

void key_set_release(void)
{
	if(!par_set.st_set)
	{
		fun_list_run_once_pure(KEY_S4);
	}	
}

void key_set_keep(void)
{
	if(gui_st.key.keep_time_cnt > 6)
		gui_st.key.b_do_none_rls = 1;
	
	if (gui_st.key.keep_time_cnt == 15)
	{
		gui_st.key.keep_time_cnt++;
		
		if (!par_set.st_set)
		{
			par_user_lck_entry();
		}
		else
		{
			par_user_opt_quit();
		}
	}
}

/*******************************************************************************
* @brief   shift.
*******************************************************************************/
void key_shift_press(void)
{
	par_user_key_shift();
}

void key_shift_release(void)
{
	if(!par_set.st_set)
	{
		fun_list_run_once_pure(KEY_S3);
	}	
}

void key_shift_keep(void)
{
}

/*******************************************************************************
* @brief   down.
*******************************************************************************/
void key_down_press(void)
{
	if (par_set.st_set > SET_ST_SCAN)
	{
		par_user_key_dec_once();
	}

	if (par_set.st_set == SET_ST_NONE)
	{
	}
}

void key_down_release(void)
{
	if(!par_set.st_set)
	{
		fun_list_run_once_pure(KEY_S2);
	}	
}

void key_down_keep(void)
{
	if (par_set.st_set == SET_ST_NONE)
	{
	}

	par_user_key_dec_keep();
}

/*******************************************************************************
* @brief   up.
*******************************************************************************/
void key_up_press(void)
{
	if (par_set.st_set > SET_ST_SCAN)
	{
		par_user_key_inc_once();
	}

	if (par_set.st_set == SET_ST_NONE)
	{
	}
}

void key_up_release(void)
{
	if(!par_set.st_set)
	{
		fun_list_run_once_pure(KEY_S1);
	}	
}

void key_up_keep(void)
{
	if (par_set.st_set == SET_ST_NONE)
	{
	}
	par_user_key_inc_keep();
}

/*******************************************************************************
* @brief   set + shift 组合.
*******************************************************************************/
void key_set_shift_press(void)
{
	if (par_set.st_set == SET_ST_SYS)
	{
		par_user_key_prev_par();
	}
}

void key_set_shift_release(void)
{
}

void key_set_shift_keep(void)
{
}
